package _0_6_回文子串_子序列_编辑距离

/*
*
原题链接:
https://leetcode.cn/problems/longest-palindromic-subsequence/

516. 最长回文子序列
给你一个字符串 s ，找出其中最长的回文子序列，并返回该序列的长度。
子序列定义为：不改变剩余字符顺序的情况下，删除某些字符或者不删除任何字符形成的一个序列。

示例 1：
输入：s = "bbbab"
输出：4
解释：一个可能的最长回文子序列为 "bbbb" 。
示例 2：

输入：s = "cbbd"
输出：2
解释：一个可能的最长回文子序列为 "bb" 。
*/
func longestPalindromeSubseq(s string) int {

	size := len(s)
	max := func(a, b int) int {
		if a > b {
			return a
		}
		return b
	}

	dp := make([][]int, size)
	for i := 0; i < size; i++ {
		dp[i] = make([]int, size)
		dp[i][i] = 1
	}

	for i := size - 1; i >= 0; i-- {
		for j := i + 1; j < size; j++ {
			if s[i] == s[j] {
				dp[i][j] = dp[i+1][j-1] + 2
			} else {
				dp[i][j] = max(dp[i][j-1], dp[i+1][j])
			}
		}
	}

	return dp[0][size-1]
}

//func longestPalindromeSubseq(s string) int {
//	size := len(s)
//
//	dp := make([][]int, size)
//	for i := 0; i < size; i++ {
//		dp[i] = make([]int, size)
//		dp[i][i] = 1
//	}
//
//	for i := size - 1; i >= 0; i-- { //起始位置
//		for j := i + 1; j < size; j++ { //结束位置
//			if s[i] == s[j] {
//				dp[i][j] = dp[i+1][j-1] + 2
//			} else {
//				dp[i][j] = max(dp[i][j-1], dp[i+1][j])
//			}
//		}
//	}
//	return dp[0][size-1]
//}
